package org.example.interceptor;

import com.alibaba.fastjson.JSONObject;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.example.context.BaseContext;
import org.example.pojo.Result;
import org.example.properties.JwtProperties;
import org.example.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.io.PrintWriter;
import java.util.Date;

@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Autowired
    private JwtProperties jwtProperties;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求url
        String url=request.getRequestURL().toString();
        log.info("请求的url：{}",url);

//        //判断服务器是否启动
//        if(url.contains("hello")) {
//            log.info("hello world");
//            response.setContentType("text/html;charset=UTF-8");
//            PrintWriter out = response.getWriter();
//            out.write("hello world!");
//            return true;
//        }

        //判断是在登录注册操作，放行
        if(url.contains("login") || url.contains("register")) {
            log.info("登录注册操作，放行");
            return true;
        }

//        response.getWriter().write("{\"error\":\"token失效！\"}");
        //获取请求头中的令界《token）
        String jwt=request.getHeader("token");

//        if (jwt==null) {
//            System.out.println("token不存在");
////            BaseContext.setCurrentId(0L);
//            response.setStatus(401); //只有这个靠谱
////            response.sendRedirect("/error");
////            throw new RuntimeException();
//            return false;
//        }

//        //判断令牌是否存在，如果不存在，返回错误结果（未登录）
//        if(!StringUtils.hasLength(jwt)) {
//            log.info("请求头token为空，返回未登录的信息");
//            Result error = Result.error("NOT_LOGIN");
//            String notLogins = JSONObject.toJSONString(error);
//
////            输出
////            {"msg": "NOT_LOGIN","code": 0}
//            response.getWriter().write(notLogins);
//            return false;
//        }

        //解析token：如果解析失败。返回错视结果（木登录）
        try { //快捷键ctrl+alt+t
            Claims claims = JwtUtils.parseJWT(jwt,jwtProperties.getUserSecretKey());
//            Long NowTime = claims.getExpiration().getTime();
//            if (NowTime >= System.currentTimeMillis()) {
//                System.out.println("当前token过期");
////                BaseContext.setCurrentId(0L);
//                response.setStatus(401); //只有这个靠谱
//                return false;
//            }

            Long id = Long.valueOf(claims.get("id").toString());
//            System.out.println("sout输出：当前员工id："+id);
//            log.info("log.info输出：当前员工id：", id);
            BaseContext.setCurrentId(id);
            return true;
        } catch (Exception e) {
//            e.printStackTrace();
//            log.info("解析令牌失败，返回未登录错误信息");
//            Result error=Result.error("NOT_LOGIN");
//            String notLogin=JSONObject.toJSONString(error);
//            response.getWriter().write(notLogin);
//            return false;

            //不是（正在登录注册，或者已登录）的其他操作非法
            //不通过，响应401状态码
            response.setStatus(401);
            return false;
        }
        //不能返回登录页面的原因：Result实体类code属性应该定义为Integer而不是String，因为老师返回的数据code怎么没有双引号
    }

//    @Override
//    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        System.out.println("postHandle");
//    }
//
//    @Override
//    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        //最好是在preHandle就解决，否则执行完才处理异常平白增加压力
//        if(response.getStatus()==401) {
//
//        }
////        System.out.println("afterCompletion");
//    }
}
